package com.gorkr.offer;

import org.junit.jupiter.api.Test;

/**
 * @author gorkr
 * @date 2022/07/28 16:15
 **/
public class M20BiaoShiShuZhiDeZiFuChuanIcof {

    public boolean isNumber(String s) {
        int n = s.length();
        int i = 0;
        if (s.charAt(i) == ' ') {
            i++;
        }
        int decimal = decimal(s, i);
        if (decimal == -1) {
            i = isInteger(s, i);
        } else {
            i = decimal;
        }
        if (i == -1) {
            return false;
        }
        if (s.charAt(i) == 'e' || s.charAt(i) == 'E') {
            i = isInteger(s, i + 1);
        }
        if (i == -1) {
            return false;
        }
        for (int j = i; j < s.length(); j++) {
            if (s.charAt(j) != ' ') {
                return false;
            }
        }
        return true;
    }

    /**
     * 整数部分确定
     *
     * @param s     字符串
     * @param start 开始判断的下标记
     * @return int 整数部分结束 的 下一个 的 下标， 如果不是整数返回-1
     */
    private int isInteger(String s, int start) {
        int cha = 0;
        int begin = start;
        int value = 0;
        //先判断第一位
        char first = s.charAt(start);
        // 不是+ - 或数字 开头 直接-1
        if (first == '+' || first == '-') {
            cha++;
            start++;
        }else if (first <= '9' && first >= '0') {

        } else {
            return -1;
        }


        while (start<s.length()) {
            char c = s.charAt(start);
            if (c <= '9' && c >= '0') {
                value++;
            } else {
                break;
            }
            start++;
        }
        if (value == 0) {
            return -1;
        }
        return begin + value + cha;
    }

    private int decimal(String s, int start) {
        int cha = 0; // 符号位
        int begin = start;
        int value = 0;
        int point = 0;
        //先判断第一位
        char first = s.charAt(start);
        // 不是+ - 或数字 开头 直接-1
        if (first == '+' || first == '-') {
            cha++;
            start++;
        }
        if (s.charAt(start) == '.') {
            point++;
            start++;

        }
        // 一个点 '.' ，后面跟着至少一位数字
        if (point == 1) {
            while (true) {
                char c = s.charAt(start);
                if (c < '9' && c > '0') {
                    value++;
                } else {
                    break;
                }
                start++;
            }
            if (value == 0) {
                return -1;
            }
            return cha + begin + point + value;
        } else {
            int left = 0;
            int right = 0;
            while (true) {
                char c = s.charAt(start);
                if (c < '9' && c > '0') {
                    left++;
                } else {
                    break;
                }
                start++;
            }
            if (s.charAt(start) == '.') {
                point++;
                start++;
            } else {
                return -1;
            }
            if (left <= 0) {
                return -1;
            }
            while (true) {
                char c = s.charAt(start);
                if (c < '9' && c > '0') {
                    right++;
                } else {
                    break;
                }
                start++;
            }
            return cha + begin + left + point + right;


        }

    }

    @Test
    public void test() {
        System.out.println(isNumber("0"));
    }

}
    